
// step 1# 函数定义：寻找字符串 s 中所有是字符串 p 的异位词的起始索引
int* findAnagrams(char* s, char* p, int* returnSize) {
    // step 2# 预分配一个足够大的结果数组
    int* ans = malloc(strlen(s) * sizeof(int)); // 存储结果的起始下标数组
    *returnSize = 0; // 初始化返回的结果数量为 0

    // step 3# 统计字符串 p 中每个字母的出现次数
    int cnt[26] = {}; // cnt[c] 表示字符 c 还需要几个（c - 'a'）
    int n = 0;        // n 表示字符串 p 的长度
    for (; p[n]; n++) {
        cnt[p[n] - 'a']++; // 对 p 中的字母统计出现次数
    }

    // step 4# 初始化滑动窗口的左边界
    int left = 0; // 窗口左端点

    // step 5# 遍历字符串 s 的每一个字符，作为右边界
    for (int right = 0; s[right]; right++) {
        int c = s[right] - 'a'; // 当前右端点字符的下标
        cnt[c]--;               // 当前字符进入窗口，需求减一

        // step 6# 如果某个字符数量小于 0，说明在窗口中多了，需要收缩左边界
        while (cnt[c] < 0) {
            cnt[s[left] - 'a']++; // 左端点字符离开窗口，释放名额
            left++;               // 左端点右移
        }

        // step 7# 如果当前窗口长度等于 p 的长度，说明找到了一个异位词
        if (right - left + 1 == n) {
            ans[(*returnSize)++] = left; // 记录当前异位词的起始位置
        }
    }

    // step 8# 返回结果数组
    return ans;
}
